<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 'use strict'
        /*
        数据属性
        Configurable: 属性是否可配置,能否被删除
        Enumerable: 属性是否可被遍历
        Writable: 属性是否可写
        Value: 属性值，默认是undefined
        
        对于对象直接赋值的属性来说，它们的 configurable/enumerable/writable 都是true，如果是使用 define...方法声明的属性，这三个属性默认为 false
        Object.defineProperty(对象，要操作的属性， 属性描述符)
        Object.defineProperties(对象，{ 要操作的属性: 属性描述符 })
        */

        var obj = {
            name: "李白",
            sayName: function () {
                console.log(this.name);
            }
        }

        // es6中对象中的函数属性可以简写为：
        var obj1 = {
            name: '李白',
            sayName() {
                console.log(this.name);
            }
        }
        obj.sayName();
        obj1.sayName();

        // es6中对象如果属性名和代表属性值的变量名一致，那么可以简写成一个变量名
        var uname = "李白";
        var age = 30;
        var obj2 = {
            uname: uname,
            age: age
        }
        var obj3 = {
            uname,
            age
        }

        console.log('obj3.uname', obj3.uname);

        Object.defineProperty(obj, 'name', {
            configurable: false,
            enumerable: false,
            writable: true,
            value: '楠楠'
        })
        // enumberable 为false时， 遍历时没有name
        for (var key in obj) {
            console.log(obj[key]);
        }
        // wirtable 为false时，重写 严格模式下报错
        obj.name = '李白';
        //    configurable 为false时，重配置时 直接报错
        //    Object.defineProperty(obj, 'name', {
        //        configurable: true
        //    })
        console.log(obj);
        // 用defineProperty直接定义的属性，configurable  writable  enumerable 都为 false
        Object.defineProperty(obj, 'tel', {
            configurable: true,
            value: '128545646'
        })
        console.log(obj.tel);
        obj.tel = 'ssd';
        console.log(obj.tel);
        // 禁止添加属性
        // Object.preventExtensions(obj);
        // 禁止添加/删除 为所有现有的属性设置 `configurable: false`。
        // Object.seal(obj);
        // 禁止添加/删除/更改属性，为所有现有属性设置 `configurable: false, writable: false`。
        Object.freeze(obj);
        obj.name = 'ss'
        obj.skill = ['js', 'h5'];
        console.log(obj);
        
        // 对他们的测试
        console.log(Object.isExtensible(obj));
        console.log(Object.isSealed(obj));
        console.log(Object.isFrozen(obj));
    </script>
</body>

</html>